

import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.*;
import org.jdom.filter.Filter;
import org.jdom.input.SAXBuilder;
import org.jdom.output.*;
import exia.java.core.entities.*;
/**
 *
 * @author 
 */
public class ServiceXML {
   
   private Element racine ;
   private org.jdom.Document document;

   public ServiceXML() throws JDOMException, IOException{
        document = new Document(racine);
   }
   
   public boolean FileExist(String fichier){
       boolean exist=false;
       SAXBuilder sxb = new SAXBuilder();
       File file = new File(fichier+".xml");
       if(file.exists()){
            try {
                document = sxb.build(file);
                racine = document.getRootElement();
            } catch (JDOMException ex) {
                Logger.getLogger(ServiceXML.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(ServiceXML.class.getName()).log(Level.SEVERE, null, ex);
            }
            exist=true;
       }
       else{
           exist=false;
       }
       return exist;
   }
   
   public List GetALLData() {
        List listLivres = racine.getChildren("Livre");
        return listLivres;
    }
   public List GetALLDataAjouter() {
       List listLivres = racine.getChildren("Ajouter");
       return listLivres;
   }
   public List GetALLDataModifier() {
       List listLivres = racine.getChildren("Modifier");
       return listLivres;
   }
  
    public List GetLivreByID(final String id,final String file) {
       
    	Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getAttributeValue("id").equals(id))
                    {
                        verifAuteur = 1;
                    }
                }
                else {
                	if(element.getChild("Livre").getAttributeValue("id").equals(id))
                    {
                        verifAuteur = 1;
                    }
                }
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;
    }
    
    public List GetDataByAuteur(final String auteur,final String file) {
       
        Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getChild("auteur").getText().toUpperCase().matches("(.*)"+auteur.toUpperCase()+"(.*)"))
                    {
                        verifAuteur = 1;
                    }
                }
                else{
                	if(element.getChild("Livre").getChild("auteur").getText().toUpperCase().matches("(.*)"+auteur.toUpperCase()+"(.*)"))
                    {
                        verifAuteur = 1;
                    }
                }
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;      
    }

    public List GetDataByEditeur(final String editeur,final String file) {
        
        Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }else{
                	if(element.getChild("Livre").getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;      
    }
    
    public List GetDataByTitreAndAuteurAndEditeur(final String titre, final String auteur,final String editeur,final String file){
    	
    	Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase())&&element.getChild("auteur").getText().toUpperCase().matches(("(.*)"+auteur+"(.*)").toUpperCase())&&element.getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                else{
                	if(element.getChild("Livre").getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase())&&element.getChild("Livre").getChild("auteur").getText().toUpperCase().matches(("(.*)"+auteur+"(.*)").toUpperCase())&&element.getChild("Livre").getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;
    }
    
    public List GetDataByTitreAndEditeur(final String titre,final String editeur,final String file){
    	
    	Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase())&&element.getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                else{
                	if(element.getChild("Livre").getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase())&&element.getChild("Livre").getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;
    }
 
    public List GetDataByAuteurAndEditeur(final String auteur,final String editeur,final String file){
 	
 	Filter filtre = new Filter()
     {
     	
         public boolean matches(Object ob){
             if(!(ob instanceof Element)){return false;}
             Element element = (Element)ob;
             int verifAuteur = 0;
             if(file.equals("Livre")){
            	 if(element.getChild("auteur").getText().toUpperCase().matches(("(.*)"+auteur+"(.*)").toUpperCase())&&element.getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                 {
                     verifAuteur = 1;
                 }
             }
             else{
            	 if(element.getChild("Livre").getChild("auteur").getText().toUpperCase().matches(("(.*)"+auteur+"(.*)").toUpperCase())&&element.getChild("Livre").getChild("editeur").getText().toUpperCase().matches(("(.*)"+editeur+"(.*)").toUpperCase()))
                 {
                     verifAuteur = 1;
                 }
             }
             
             
             if(verifAuteur == 1)
                 return true;
             else
                 return false;
         }
         
     };
      List resultat = racine.getContent(filtre);
      return resultat;
 }
  
    public void DeleteLivre(final String id) {
          
    	Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(element.getAttributeValue("id").equals(id))
                {
                    verifAuteur = 1;
                }
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.removeContent(filtre);
         enregistre("Livre.xml");
    }
    
    public List GetDataByTitre(final String titre,final String file){
    	
    	Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                else{
                	if(element.getChild("Livre").getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;
    }
    
    public List GetDataByTitreAndAuteur(final String titre,final String auteur,final String file){
    	
    	Filter filtre = new Filter()
        {
        	
            public boolean matches(Object ob){
                if(!(ob instanceof Element)){return false;}
                Element element = (Element)ob;
                int verifAuteur = 0;
                if(file.equals("Livre")){
                	if(element.getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase())&&element.getChild("auteur").getText().toUpperCase().matches(("(.*)"+auteur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }else{
                	if(element.getChild("Livre").getChild("titre").getText().toUpperCase().matches(("(.*)"+titre+"(.*)").toUpperCase())&&element.getChild("Livre").getChild("auteur").getText().toUpperCase().matches(("(.*)"+auteur+"(.*)").toUpperCase()))
                    {
                        verifAuteur = 1;
                    }
                }
                
                
                if(verifAuteur == 1)
                    return true;
                else
                    return false;
            }
            
        };
         List resultat = racine.getContent(filtre);
         return resultat;
    	
    }
    
    public void affiche()
    {
       try
       {
          //On utilise ici un affichage classique avec getPrettyFormat()
          XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
          sortie.output(document, System.out);
       }
       catch (java.io.IOException e){}
    }

    public void enregistre(String fichier)
{
   try
   {
      //On utilise ici un affichage classique avec getPrettyFormat()
      XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
      sortie.output(document, new FileOutputStream(fichier));
      
   }
   catch (java.io.IOException e){}
}
    
    public void AddLivre(Livre livre,String file,String genre){

    		Element famille = new Element(genre);
    		racine.addContent(famille);
    	    Element newLivre = new Element("Livre");
    	    famille.addContent(newLivre);
    	    Attribute classe = new Attribute("id",Integer.toString(livre.getIdLivre()));
        	newLivre.setAttribute(classe);
    	    Element titre = new Element("titre");
    	    titre.setText(livre.getTitre());
    	    Element auteur = new Element("auteur");
    	    auteur.setText(livre.getAuteur());
    	    Element editeur = new Element("editeur");
    	    editeur.setText(livre.getEditeur());
    	    Element descriptif = new Element("descriptif");
    	    descriptif.setText(livre.getDescriptif());
    	    Element annee = new Element("annee");
    	    annee.setText(livre.getAnnee().toString());
    	    Element prix = new Element("prix");
    	    prix.setText(livre.getPrix().toString());
    	    Element quantite = new Element("quantite");
    	    quantite.setText(livre.getQuantite().toString());
    	    newLivre.addContent(titre);
    	    newLivre.addContent(auteur);
    	    newLivre.addContent(editeur);
    	    newLivre.addContent(annee);
    	    newLivre.addContent(descriptif);
    	    newLivre.addContent(prix);
    	    newLivre.addContent(quantite);
    	    enregistre(file+".xml");
    
    }

}
